package org.yzhzc.common.message.service;

import com.alibaba.fastjson2.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.dysmsapi20170525.models.SendSmsResponseBody;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 阿里云短信服务类
 * 该类负责调用阿里云 API 发送短信
 */

@Slf4j
@Component
public class AliSmsService {

    // 注入阿里云短信服务的客户端
    @Autowired
    private Client aliClient;

    // 业务配置：短信模板代码
    @Value("${sms.aliyun.templateCode:}")
    private String templateCode;

    // 业务配置：短信签名
    @Value("${sms.aliyun.sing-name:}")
    private String singName;

    /**
     * 发送短信验证码
     *
     * @param phone 手机号码
     * @param code  短信验证码
     * @return 是否发送成功
     */
    public boolean sendMobileCode(String phone, String code) {
        // 设置短信参数，传递验证码
        Map<String, String> params = new HashMap<>();
        params.put("code", code);
        // 调用发送模板消息方法
        return sendTempMessage(phone, singName, templateCode, params);
    }

    /**
     * 发送短信模板消息
     *
     * @param phone        手机号码
     * @param singName     短信签名
     * @param templateCode 短信模板代码
     * @param params       短信模板的参数
     * @return 是否发送成功
     */
    public boolean sendTempMessage(String phone, String singName, String templateCode,
                                   Map<String, String> params) {
        // 创建发送短信请求对象
        SendSmsRequest sendSmsRequest = new SendSmsRequest();
        sendSmsRequest.setPhoneNumbers(phone) // 设置接收短信的手机号
                      .setSignName(singName)  // 设置短信签名
                      .setTemplateCode(templateCode)  // 设置短信模板代码
                      .setTemplateParam(JSON.toJSONString(params));  // 设置短信模板参数

        try {
            // 调用阿里云的发送短信 API
            SendSmsResponse sendSmsResponse = aliClient.sendSms(sendSmsRequest);
            SendSmsResponseBody responseBody = sendSmsResponse.getBody();

            // 判断短信发送是否成功
            if (!"OK".equalsIgnoreCase(responseBody.getCode())) {
                // 发送失败，记录日志
                log.error("短信{} 发送失败，失败原因:{}.... ", JSON.toJSONString(sendSmsRequest), responseBody.getMessage());
                return false;
            }
            // 发送成功
            return true;
        } catch (Exception e) {
            // 捕获异常并记录日志
            log.error("短信{} 发送失败，失败原因:{}.... ", JSON.toJSONString(sendSmsRequest), e.getMessage());
            return false;
        }
    }
}
